#ifndef __PILE_H__
#define __PILE_H__


#define BLOCK -2
#define UNDEF -1
#define INT_TYPE 0
#define FLOAT_TYPE 1
#define STRING_TYPE 2
#define BOOL_TYPE 3
#define VOID 4

struct var
{
  char* id;
  char* reg;
  int type;
  int arg;
  struct var * precedent;
  struct var * suivant;
};

struct pile_var
{
  struct var * premier_glo;
  struct var * dernier_glo;
  struct var * premier_loc;
  struct var * dernier_loc;
};


struct fonc
{
  char* reg;
  char* type;
  int type_ret;
  struct fonc * precedent;
  struct fonc * suivant;
};


struct pile_fonc
{
  struct fonc * premier;
  struct fonc * dernier;
};

struct type
{
  char* nom;
  struct type * suivant;
};

struct pile_type
{
  int nb; 
  struct type * premier;
  struct type * dernier;
};


//Fonc

struct pile_fonc * initPileFonc();
char * getFoncType(struct pile_fonc* p,char *nom);
int getFoncTypeRet(struct pile_fonc* p,char *nom);
void ajouterFonc(struct pile_fonc * p, char * nom, char* type, int type_ret);
int existeFonc(struct pile_fonc* p,char *nom);

//Var
struct pile_var * reInitPileLoc(struct pile_var * p);
struct pile_var * initPileVar();
void ajouterVar(struct pile_var* p, char* id);
void setVarType(struct pile_var * p, char * id, int type);
void setVarArg(struct pile_var * p, char * id);
int estVarArg(struct pile_var * p, char * id);
int typeVar(struct pile_var * p, char * id);
int existeVar(struct pile_var * p, char * id);
char * regVar(struct pile_var * p, char * id);
void depiler(struct pile_var * p);
void empilerSent(struct pile_var * p);



//void ajouterType(struct pile_type* p, char* nom);
#endif
